パソコン活用研究PCマニアックの道(アセンブラ、DOS、Windows、旧型PCの活用研究)
PL/Iの入手その2(CP/M用コンパイラ)
1 CP/MのPL/Iコンパイラ
PL/Iフリークに朗報!!!(古参のIBMer以外には日本にはあまりいないか)
海外のサイトにCP/M用のPL/IコンパイラがFree(フリー)で落ちているのを発見!!
CP/M-80、CP/M-86用の他に、MS-DOS上でも使えるものがあるみたいです。
Free Compiler(フリーコンパイラのリンク集)のCP/Mコンパイラ関連のサイト、PL/I関連の
サイトを探してみて下さい。
おじさんが探して見たところ以下のものが見つかりました。
Pli80_13.zip | CP/M-80用のPL/Iコンパイラ。動作確認しました。 |
Pli-b.zip | これも、CP/M-80など8080用のPL/Iと思われる。中身はほぼPli80_13.zipと同じだが、 Plilib.ilrが不良?のためかLinkが正常にできない。 |
pli86.zip | CP/M-86用のPL/Iコンパイラ。実行ファイルまで生成できるが、(CP/Mエミュレーター上 で)実行するとエラーの発生するプログラムがある。 |
pli86-x.zip | MS-DOS上で使えるPL/Iコンパイラ。 |
pli_dos.zip | これもMS-DOS上で使えるPL/Iコンパイラと思われるが、Linkの仕方が不明。(Linkerがない?) |
2 Pli80_13
1) 準備
CP/M-80用のPL/Iコンパイラです。
MS-DOS上で使うCP/Mエミュレーターをかませて使えば、動作します。
CP/Mエミュレーターも何種類かあります。
Vector や Free Compiler にあるサイトから探して下さい。
今回ここでは、村上敬司氏のCPMエミュレーターを使います(Vectorにあります。)
2) コンパイル手順
では、以下のsample.pliのコンパイルをしてみます。
sample: proc options(main); put list('hello'); end; /* of main program */ |
(1) FCBの設定
ファイルのオープンにFCB(ファイルコントロールブロック)を使っているらしく、まずFCBの設定をします。
FCBの値は5から8位にしておけばいいのではないかと思います。
DOSプロンプト(DOS窓)の標準設定のままでは、「FCBが使えません」というエラーが出るので、
(A)純粋なMS-DOSでConfig.sysに fcbs = 8
と設定するか
(B) 以下の設定をしてMS-DOSモードで使用します。
MS-DOSプロンプトのプロパティの「プログラム」タブの詳細設定で、以下の通り
MS-DOSモードを選択し、「MS-DOSモード用のConfig.sysファイル」に fcbs=8
と記述します。
(これは、Windows9xかMeでないとつかえませんえね)
(C) DOSプロンプトのままで使えるようにしたいなら、config.sys自体に fcbsの記述をすれば
いいが、あまりおすすめではない。
(2) コンパイラ、リンカーの拡張子変更
これ以降、必要なファイルは全てフロッピーディスクに入れて作業をしますので
全ての作業は A>
で行います。(必要に応じて読み替えてください)
村上氏のCP/Mエミュレーターは、エミュレートされる実行ファイルの拡張子は .cpm
でなくては
なりません。(備考参照)
従って、まずPli80_13の実行ファイル(.com)の拡張子を変更します。
A> copy *.com *.cpm
これで、 pli.cpm(コンパイラ) link.cpm(リンカー)ができます。
(補足) 村上氏のCP/Mエミュレーターについて。同梱のドキュメントからの抜粋です。
使い方
まず、CP/MのプログラムをMS−DOSに持ってきます。このとき、拡張子".com"
を
".cpm" にしておく必要があります。
CP/Mのプログラムを実行するには、第一引数をCP/Mのプログラム名とし、
その後にCP/Mのプログラムに与えるパラメータを書きます。
cpm プログラム名 パラメータ...
つまり、CP/Mのコマンドラインの前に"cpm"
を付けたようなかっこうになります。
例えば、カレントディレクトリにある zsid.cpm
を使って test.com デバッグする
には、次の様にします。(test.com
を実行するときには拡張子を.cpm にします)
cpm zsid test.com
また、他のディレクトリにあるCP/Mプログラムも実行することができます。
cpm b:\cpm\turbo
作者の連絡先 村上敬司
(3) コンパイルとリンク
コンパイルします。
A>cpm pli sample
これで sample.rel ができます。
ライブラリ等とリンクします。
A>cpm link sample,plilib.irl
これで、 sample.com ができます。
これは、CP/M-80用の実行ファイルなので、そのままではDOS上では実行できません。
CPMエミュレーターで実行できるように拡張子を.cpmに変更します。
A>ren sample.com sample.cpm
として名前を変更するか、copyコマンドで以下のようにしてもO.K.です。
A>copy sample.com sample.cpm
3) 実行
では、実行してみます。
今回のsample.cpm
は、特にファイルのオープンなどをしない単純なプログラムなので、
DOSプロンプト(DOS窓)でFCBの設定をしなくても実行できます。
以下実行の様子です。
A:>cpm sample hello End of Execution A:> |
3 PLI86
1) 準備
CP/M-86用のPL/Iコンパイラです。
CP/M-86用のエミュレーターで動かします。CP/M-86のエミュレーターは上記のFree Compilerサイトを
探せば、簡単にみつかります。
今回は、cpmemu.zipに含まれているエミュレーターを使います。CP/M-86用のエミュレーター
はcpm.exe というファイルです。
cpmの後に、CP/M-86の実行ファイルの拡張子を省いて、記述します。
(CP/M-86の実行ファイル(コマンドファイル)の拡張子は .cmd
です。)
例えば,sample.cmd を実行したい場合は、cpm sample
のように記述します。
2) コンパイル、リンク、実行
では、dfact.pli
というプログラムをコンパイルして実行してみます。nの階乗を求めるプログラムです。
ソースファイルdfact.pli です
/******************************************************/ /* This program evaluates the Factorial function (n!) */ /* using recursion and FIXED DECIMAL data. */ /******************************************************/ dfact: procedure options(main); declare i fixed; do i = 0 repeat(i+1); put skip list('Factorial(',i,')=',factorial(i)); end; stop; factorial: procedure(i) returns(fixed decimal(15,0)) recursive; declare i fixed; if i = 0 then return (1); return (decimal(i,15) * factorial(i-1)); end factorial; end dfact; |
コンパイル、リンク、実行の様子です。
C:\dload\pli86\pli86-1
というフォルダで作業をしています。
コンパイルにより、.obj
という拡張子を持つオブジェクトファイルができます。
リンクすると(リンカーは link86.cmd)、.cmd
という拡張子を持つ実行ファイルができます。
C:\dload2\pli86\PLI86-1>cpm pli dfact CP/M-86 emulator for DOS vers 1.3 - 11/30/97 Copyright (c) 1985, 1997 Jim Lopushinsky -------------------------------------------------- PL/I-86 Compiler Version 1.0 Serial No. 3034-0000-000944 All Rights Reserved Copyright (c) 1982,1983 Digital Research, Inc. -------------------------------------------------- Compilation of: DFACT No Error(s) in Pass 1 No Error(s) in Pass 2 Code Size: 00BD Data Size: 0022 End of Compilation C:\dload2\pli86\PLI86-1>cpm link86 dfact,plilib.l86 CP/M-86 emulator for DOS vers 1.3 - 11/30/97 Copyright (c) 1985, 1997 Jim Lopushinsky -------------------------------------------------- LINK-86 Linkage Editor Version 1.01 Serial No. 3034-0000-000944 All Rights Reserved Copyright (C) 1982,1983 Digital Research, Inc. -------------------------------------------------- CODE 05437 DATA 00C21 USE FACTOR: 11% C:\dload2\pli86\PLI86-1>cpm dfact Copyright (c) 1985, 1997 Jim Lopushinsky Factorial( 0 )= 1 Factorial( 1 )= 1 Factorial( 2 )= 2 Factorial( 3 )= 6 Factorial( 4 )= 24 Factorial( 5 )= 120 Factorial( 6 )= 720 Factorial( 7 )= 5040 Factorial( 8 )= 40320 Factorial( 9 )= 362880 Factorial( 10 )= 3628800 Factorial( 11 )= 39916800 Factorial( 12 )= 479001600 Factorial( 13 )= 6227020800 Factorial( 14 )= 87178291200 Factorial( 15 )= 1307674368000 Factorial( 16 )= 20922789888000 Factorial( 17 )= 355687428096000 Factorial( 18 )= FIXED OVERFLOW (1) Traceback: 3206 00AF 8000 0572 # 3737 6402 0047 0BDE End of Execution C:\dload2\pli86\PLI86-1> |
4 PLI86-x
DOS上で動くPL/Iコンパイラです。
DOSプロンプト上で動作しますので、これは便利でしょう。
では、最大公約数を求めるプログラム gcm.pli
のコンパイルをしてみます。
ソースプログラムは以下の通りです。
gcm: proc options(main); declare a,b,x bin fixed; put list('**gcm**'); put skip list('input 2 integer: '); get list(a,b); label1: x=mod(a,b); a=b; b=x; put skip list (a,b); if x = 0 then go to label2; else go to label1; label2: put skip list ('gcm: ',a); end gcm; |
では、コンパイルとリンクそして、実行までの手順をみてみましょう。
今回も、必要なファイルをフロッピーディスクに全て入れて、 A>で作業をしています。
コンパイルすると、gcm.obj
というオブジェクトファイルができます。これをリンカーlink86.exe
でリンクすると(ランタイムライブラリーはplilib.l86)、gcm.exe
という実行ファイルができます。
A:\>pli gcm -------------------------------------------------- PL/I-86 Compiler Version 1.0 Serial No. 3091-0000-002381 All Rights Reserved Copyright (c) 1982,1983 Digital Research, Inc. -------------------------------------------------- PL/I-86 V1.0 Compilation of GCM No Error(s) in Pass 1 No Error(s) in Pass 2 Code Size: 00D7 Data Size: 0023 End of Compilation A:\>link86 gcm,plilib.l86 -------------------------------------------------- LINK-86 Linkage Editor Version 1.3 Serial No. 3091-0000-002381 All Rights Reserved Copyright (C) 1982-1984 Digital Research, Inc. -------------------------------------------------- CODE 054F2 DATA 00CBB USE FACTOR: 12% A:\>gcm **gcm** input 2 integer: 268,144 144 124 124 20 20 4 4 0 gcm: 4 End of Execution |
なお、このPLI86-x にはlinkcmd.exeという、CP/M-86のコマンドファイル(実行ファイル)を生成する
(と推測される)リンカーも含まれています。しかし、これによって作られた、実行ファイル(拡張子 .cmd)
は、CP/M-86用のエミュレーターをかまして実行しても正常に動作しません。(おじさんの環境では)
5 補足
今回ここでとりあげたコンパイラは、もう15年以上前のものですが本格的なPL/Iコンパイラです。
ちょっとプログラムの勉強に使うのであれば十分でしょう。
ただし、いずれもマニュアル類がほとんどついていないので、昔CP/Mで使った経験がないと
使えるようになるまでけっこう大変かもしれません。おじさんも結構試行錯誤しました。